package main

import "fmt"

// 结构体是值类型的

type preson struct {
	name, gender string
}

// go语言中传参永远是copy  副本
// func f(x preson) {
// 	x.gender = "副本" // 修改的是副本的gender
// }
func f(x *preson) {
	(*x).gender = "学习" // 根据内存地址找到那个原变量，修改的就是原来的变量
	x.gender = "学习"    // 语法糖，自动根据指针找对应的变量
}
func main() {
	var p preson
	p.name = "厚么"
	p.gender = "无"
	f(&p)
	fmt.Println(p.gender) // 学习
	var p2 = new(preson)
	(*p2).name = "理想"
	p2.name = "string"
	fmt.Printf("%T\n", p2)  // p2保存的值就是一个内存地址
	fmt.Printf("%p\n", &p2) // 求p2的内存地址
	// 2.结构体指针2
	// 2.1 key-value初始化
	var p3 = &preson{
		name:   "元帅",
		gender: "男",
	}
	fmt.Printf("%#v\n", p3)
	// 2.2 使用值列表的形式初始化,值的顺序要和结构体定义时的字段顺序一致
	p4 := &preson{
		"小王子",
		"男",
	}
	fmt.Printf("%#v\n", p4)
	// fmt.Println(*p4)
}
